package juc;
/*
*  一、volatile 关键字：当多个线程操作共享数据时，保证内存中数据可见
*               相较于 synchronized 是一种轻量级同步策略
*               缓存一致性协议（MESI协议）它确保每个缓存中使用的共享变量的副本是一致的。
*               其核心思想如下：当某个CPU在写数据时，如果发现操作的变量是共享变量，则会通知其他CPU告知该变量的缓存行是无效的，
*               因此其他CPU在读取该变量时，发现其无效会重新从主存中加载数据。
*
*   注意：1.volatile 不具备互斥性
*        2.volatile 不能保证变量原子性
*
* */
public class TestVolatile {
    public static void main(String[] args) {
        ThreadDemo demo = new ThreadDemo();
        new Thread(demo).start();
        while (true) {
            if (demo.isFlag()) {
                System.out.println("----------");
                break;
            }
        }
    }
}
class ThreadDemo implements Runnable {
    private volatile boolean flag = false;

    @Override
    public void run() {

        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        flag = true;

        System.out.println("flag = " + isFlag());

    }
    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}
